#include<bits/stdc++.h>
#define lowbit(i) i&(-i)
using namespace std;
const int maxn=1001000+5;
int C[maxn],In[maxn],Out[maxn];
int getsum(int x) {
	int ans=0;
	while(x) ans+=C[x],x-=lowbit(x);
	return ans;
}
void add(int x,int k,int n) {
	while(x<=n) C[x]+=k,x+=lowbit(x);
}
struct Edge {
	int u,v,w=1,nXt;
} e[maxn];
int E,elast[maxn],P_[maxn],dep[maxn];
void get_add(int u,int v/*,int w*/) {
	e[++E].u=u;
	e[E].v=v;
	// e[E].w=w;
	e[E].nXt=elast[u];
	elast[u]=E;
}
int cnt=0;
void dfs(int x,int fa) {
	In[x]=++cnt,Out[x]=cnt;
	dep[x]=dep[fa]+1;
    int y;
	for(int i=elast[x]; i; i=e[i].nXt) {
		int y=e[i].v;
		if(y==fa) continue;
		dfs(y,x);
	}
	Out[x]=cnt;
}
int read(){
	int x;
	scanf("%d",&x);
	return x;
}
int main() {
	int n=read();
	for(int i=1,u=0/*A_*/,v=0/*B_*/; i<n; i++) {
		u=read(),v=read();
		get_add(u,v);
		get_add(v,u);
	}
	for(int i=1; i<=n; i++) {
		P_[i]=read();
	}
	dfs(1,0);
	for(int i=1; i<=n; i++) {
		add(In[P_[i]],1,n);      //___ 
		add(Out[P_[i]]+1,-1,n);  //覆盖
        printf("%d\n",getsum(In[P_[i]])-1/*减去当前覆盖*/);
	}
}